package com.cogent.common.reflect;

import java.util.HashMap;
import java.util.Map;

import com.cogent.common.exception.SystemRuntimeException;

/**
 * Bean类型转换工厂处理类。</br>
 * 提供Bean类型转换。提供以下数据类型转换<br/>
 * int<br/>
 * java.lang.Integer<br/>
 * boolean<br/>
 * java.lang.Boolean<br/>
 * float<br/>
 * java.lang.Float<br/>
 * double<br/>
 * java.lang.Double<br/>
 * java.lang.String<br/>
 * java.util.Date<br/>
 * 忽略掉以下类型，OMIT_TYPE_MAP中的类型<br/>
 * com.cogent.menu.domain.MenuDomain
 * @author daiys 
 * @version 1.0<br/>
 * ****************************************************<br/>
 * 版本号	 修改日期		作者			更改原因<br/>
 * 1.0		2009-11-24	daiys		新增<br/>
 * 1.1		2009-12-1	daiys		增加了反射忽略处理类型
 * ****************************************************<br/>
 */
public class BeanTypeDeal {
	
	/*
	 * 处理支持类的Map
	 */
	private static final Map<String, AbstractDeal> BEAN_TYPE_MAP = new HashMap<String, AbstractDeal>();
	
	/**
	 * 忽略处理类的Map
	 */
	public static final Map<String, String> OMIT_TYPE_MAP = new HashMap<String, String>();
	
	/**
	 * 静态方法
	 */
	static {
		BEAN_TYPE_MAP.put("int", new IntDeal());
		BEAN_TYPE_MAP.put("class java.lang.Integer", new IntegerDeal());
		BEAN_TYPE_MAP.put("boolean", new BoolDeal());
		BEAN_TYPE_MAP.put("class java.lang.Boolean", new BooleanDeal());
		BEAN_TYPE_MAP.put("float", new FloatDeal());
		BEAN_TYPE_MAP.put("class java.lang.Float", new ComplexFloatDeal());
		BEAN_TYPE_MAP.put("double", new DoubleDeal());
		BEAN_TYPE_MAP.put("class java.lang.Double", new ComplexDoubleDeal());
		BEAN_TYPE_MAP.put("class java.lang.String", new StringDeal());
		BEAN_TYPE_MAP.put("class java.util.Date", new DateDeal());
		
		OMIT_TYPE_MAP.put("class com.cogent.menu.domain.MenuDomain", "");
	}
	
	/**
	 * 根据指定对象类型将传入值转换为相应的对象
	 * @param type 转换对象类型
	 * @param val 值
	 * @return 转换后的对象
	 */
	public static Object getObject(String type, String val) {
		if(BEAN_TYPE_MAP.containsKey(type)) {
			AbstractDeal abstractDeal = (AbstractDeal)BEAN_TYPE_MAP.get(type);
			return abstractDeal.getObject(val);
		} else {
			throw new SystemRuntimeException(SystemRuntimeException.LOW, 
					"无法加载" + type + "类型的转换类");
		}
	}
	
	/**
	 * 根据指定对象类型将传入对象转换为String类型
	 * @param type 转换对象类型
	 * @param obj 待转换对象
	 * @return String对象
	 */
	public static String getString(String type, Object obj) {
		if(BEAN_TYPE_MAP.containsKey(type)) {
			AbstractDeal abstractDeal = (AbstractDeal)BEAN_TYPE_MAP.get(type);
			return abstractDeal.getString(obj);
		} else {
			throw new SystemRuntimeException(SystemRuntimeException.LOW, 
					"无法加载" + type + "类型的转换类");
		}
	}
}
